﻿
using System;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web.Security;
using ABC.Core.Configuration;
using System.Collections.Generic;

namespace ABC.Business.Models
{
    public class AuthenticationModel
    {
        private readonly RosModel rosModel;
        private readonly YandexModel yandexModel;

        public AuthenticationModel()
        {
            rosModel = IoC.Resolve<RosModel>();
            yandexModel = IoC.Resolve<YandexModel>();
        }

        public bool Authenticate(string login, string password, bool save, string byAuth = "Email")
        {
            var user = rosModel.GetEntities("Пользователь", byAuth, login, new[] { "ПарольПользователя" }).FirstOrDefault();

            if (user != null && user["ПарольПользователя"].ToString() == password)
            {
                var userId = user.Field<decimal>("id_node");
                FormsAuthentication.SetAuthCookie(userId.ToString(CultureInfo.InvariantCulture), save);
                return true;
            }
            return false;
        }

        public decimal Register(Dictionary<string, object> v)
        {
            using (var client = new RosService.Client())
            {
                var id = client.Архив.ДобавитьРаздел("Пользователи", "Пользователь", v);
                if (yandexModel.RegisterUser(id.ToString(), "1234567890") && yandexModel.EditUser(id.ToString(), "1234567890",
                                     string.IsNullOrEmpty(v["Имя"].ToString()) ? "" : v["Имя"].ToString(), "Фамилия", 0,
                                     "Девичья фамилия матери", "Фамилия"))
                {
                    rosModel.UpdateEntityValue(id.ToString(), "Email-1", string.Format("{0}{1}", id, "@azb24.ru"));
                    rosModel.UpdateEntityValue(id.ToString(), "ТипEmail-1", "Системная");
                }
                return id;
            }
        }

        public string RemindByEmail(string v)
        {
            using (var client = new RosService.Client())
            {
                var query = new RosService.Data.Query();
                query.ДобавитьТипы("Пользователь");
                query.ДобавитьУсловиеПоиска("Email", v);
                query.ДобавитьВыводимыеКолонки("ПарольПользователя");
                var result = client.Архив.Поиск(query).AsEnumerable().FirstOrDefault();
                if (result != null)
                {
                    return result.Convert<string>("ПарольПользователя");
                }
                return string.Empty;
            }
        }
        public string RemindByPhone(string v)
        {
            using (var client = new RosService.Client())
            {
                var query = new RosService.Data.Query();
                query.ДобавитьТипы("Пользователь");
                query.ДобавитьУсловиеПоиска("ТелефонныйНомер", v); //Regex.Replace(v, "[^0-9+]", "")
                query.ДобавитьВыводимыеКолонки("ПарольПользователя");
                var result = client.Архив.Поиск(query).AsEnumerable().FirstOrDefault();
                if (result != null)
                {
                    return result.Convert<string>("ПарольПользователя");
                }
                return string.Empty;
            }
        }

        public bool IsPhoneNumber(string phone)
        {
            return rosModel.GetEntities("Пользователь", "ТелефонныйНомер", phone, null).Any();
        }

        public bool IsEmail(string email)
        {
            return rosModel.GetEntities("Пользователь", "Email", email, null).Any();
        }

        public string GetUserIdBy(string str, string byWhat = "Email")
        {
            var user = rosModel.GetEntities("Пользователь", byWhat, str, null).FirstOrDefault();
            return user != null ? user["id_node"].ToString() : string.Empty;

        }

        public string GetUserEmail(string id)
        {
            return rosModel.GetEntityValue<string>(id, "Email");
        }

        public bool IsActive(string id)
        {
            return rosModel.GetEntityValue<bool>(id, "Активен");
        }

        public void SignOut()
        {
            FormsAuthentication.SignOut();
        }

        public int GetRandomNumber()
        {
            var random = new Random();
            return random.Next(10000, 99999);
        }

        public void UpdateUserActivationCode(string email, string number)
        {
            var userId = GetUserIdBy(email);
            rosModel.UpdateEntityValue(userId, "КодАктивации", number);
        }

        public bool ConfirmRegister(string email, string number)
        {
            var userId = GetUserIdBy(email);
            var codeActiovationUser = rosModel.GetEntityValue<string>(userId, "КодАктивации");
            if (codeActiovationUser == number)
            {
                rosModel.UpdateEntityValue(userId, "Активен", true);
                rosModel.UpdateEntityValue(userId, "EmailАктивен", true);
                return true;
            }
            return false;
        }

        public bool StringIsEmail(string email)
        {
            var rgx = new Regex(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}");
            return rgx.IsMatch(email);
        }
        public bool StringIsPhone(string email)
        {
            var rgx = new Regex(@"[0-9]{1,10}");
            return rgx.IsMatch(email);
        }
    }
}
